package arrays_;

import java.util.Arrays;
import java.util.List;

/**
 * @author DCSGO
 * @version 1.0
 * 二分查找 拷贝 填充(覆盖)
 * 比较数组 数组转List
 */
public class ArraysMethod02 {
    public static void main(String[] args) {
        //通过 Arrays.asList 将一个数组转化成一个对应的 List
        Integer[] arr1={1,2,3,4};
        List asList=Arrays.asList(arr1);

        System.out.println(asList);//[1, 2, 3, 4]
        System.out.println(asList.getClass());//class java.util.Arrays$ArrayList
        //可以看出asList 返回的是一个 Arrays 的内部类
        //private static class ArrayList<E> extends AbstractList<E>
        //        implements RandomAccess, java.io.Serializable
    }

    public static void main4(String[] args) {
        //通过 Arrays.equals 判断两个数组是否完全相同
        Integer[] arr1 = {1, 2, 3};
        Integer[] arr2 = {1, 2, 3};
        System.out.println(Arrays.equals(arr1, arr2));//true

        arr2[0]=11;
        System.out.println(Arrays.equals(arr1,arr2));//false

        Integer[] arr3=Arrays.copyOf(arr1,arr1.length-1);
        System.out.println(Arrays.equals(arr1,arr3));//false
    }

    public static void main3(String[] args) {
        //通过 Arrays.fill(Integer[] a,val) 将传入的数组中的所有元素替换为 val
        Integer[] nums = {1, 2, 3};
        Arrays.fill(nums, 666);
        System.out.println(Arrays.toString(nums));//[666, 666, 666]
    }

    public static void main2(String[] args) {
        //通过 Arrays.copyOf 拷贝一个数组中的指定个元素 并返回新生成的数组的引用
        Integer[] nums1 = {1, 2, 3, 4};
        Integer[] newNums = null;

        newNums = Arrays.copyOf(nums1, nums1.length);
        System.out.println(Arrays.toString(newNums));//[1, 2, 3, 4]

        newNums = Arrays.copyOf(nums1, nums1.length - 2);
        System.out.println(Arrays.toString(newNums));//[1, 2]

        newNums = Arrays.copyOf(nums1, 0);
        System.out.println(Arrays.toString(newNums));//[]

        newNums = Arrays.copyOf(nums1, nums1.length + 2);
        System.out.println(Arrays.toString(newNums));//[1, 2, 3, 4, null, null]

        //抛出异常 NegativeArraySizeException 负的数组长度异常
        //nums = Arrays.copyOf(nums1, -1);

    }

    public static void main1(String[] args) {
        //               0  1  2  3  4  5  6  7
        Integer[] arr = {1, 2, 3, 3, 3, 5, 6, 7};
        //Arrays.binarySearch 利用二分查找算法查找一个有序数组中的指定元素
        //若该元素在数组中则返回其下标(若存在重复元素就返回第一个匹配到的)
        //如该元素不在数组中则返回其应该在的下标+1的相反数
        System.out.println(Arrays.binarySearch(arr, 1));//0
        System.out.println(Arrays.binarySearch(arr, 3));//3
        System.out.println(Arrays.binarySearch(arr, 0));//-1
        System.out.println(Arrays.binarySearch(arr, 4));//-6
        System.out.println(Arrays.binarySearch(arr, 8));//-9
    }


}
